/*
 * Copyright 2012 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.google.android.apps.mytracks.clientes;

import com.doverty.android.maps.mytracks.R;
import com.google.android.apps.mytracks.AbstractMyTracksActivity;
import com.google.android.apps.mytracks.content.Cliente;
import com.google.android.apps.mytracks.content.TelefonoCliente;
import com.google.android.apps.mytracks.services.TrackRecordingServiceConnection;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.TrackRecordingServiceConnectionUtils;

import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

/**
 * An activity to add/edit a cliente.
 *
 * @author Jimmy Shih
 */
public class ClienteEditActivity extends AbstractMyTracksActivity {

  private static final String TAG = ClienteEditActivity.class.getSimpleName();

  public static final String EXTRA_TRACK_ID = "track_id";
  public static final String EXTRA_CLIENTE_ID = "cliente_id";

  private long trackId;
  private long clienteId;
  private boolean newCliente;
  private TrackRecordingServiceConnection trackRecordingServiceConnection;
  private Cliente cliente;
  private List<TelefonoCliente> telefonosCliente;
  private TelefonoClienteDataSource dbTelefonoCliente;
  private ClienteDataSource dbCliente;


  // UI elements
  private EditText clienteNombre;
  private TextView clienteTelefono1;
  private Spinner clienteTelefonoTipo1;
  private ArrayAdapter<CharSequence> myAdap;
  private TextView nuevoTelefono1;
  private TextView clienteTelefono2;
  private Spinner clienteTelefonoTipo2;
  private TextView nuevoTelefono2;
  private TextView clienteTelefono3;
  private Spinner clienteTelefonoTipo3;
  private EditText clienteDireccion;
  private EditText clienteEmail;

  private Button done;

  @Override
  protected void onCreate(Bundle bundle) {
    
    super.onCreate(bundle);
    trackId = getIntent().getLongExtra(EXTRA_TRACK_ID, -1L);
    clienteId = getIntent().getLongExtra(EXTRA_CLIENTE_ID, -1L);
    newCliente = clienteId == -1L;
    trackRecordingServiceConnection = new TrackRecordingServiceConnection(this, null);
    myAdap = ArrayAdapter.createFromResource(this, R.array.tipos_telefono,android.R.layout.simple_spinner_item);
    getupUIElements();
    setupUIElements();
    updateUiByclienteId();
  }

  private void getupUIElements() {
    
    clienteNombre = (EditText) findViewById(R.id.cliente_edit_name);
    clienteTelefono1 = (EditText) findViewById(R.id.cliente_edit_telefono_num1);
    clienteTelefonoTipo1 = (Spinner) findViewById(R.id.cliente_edit_telefono_tipo1);
    nuevoTelefono1 = (TextView) findViewById(R.id.cliente_edit_telefono_nuevo1);
    clienteTelefono2 = (EditText) findViewById(R.id.cliente_edit_telefono_num2);
    clienteTelefonoTipo2 = (Spinner) findViewById(R.id.cliente_edit_telefono_tipo2);
    nuevoTelefono2 = (TextView) findViewById(R.id.cliente_edit_telefono_nuevo2);
    clienteTelefono3 = (EditText) findViewById(R.id.cliente_edit_telefono_num3);
    clienteTelefonoTipo3 = (Spinner) findViewById(R.id.cliente_edit_telefono_tipo3);
    clienteDireccion = (EditText) findViewById(R.id.cliente_edit_direccion);
    clienteEmail = (EditText) findViewById(R.id.cliente_edit_email);
    Button cancel = (Button) findViewById(R.id.cliente_edit_cancel);
    cancel.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        finish();
      }
    });
    done = (Button) findViewById(R.id.cliente_edit_done);
    done.setText(newCliente ? R.string.generic_add : R.string.generic_save);
  }

  private void setupUIElements() {


    clienteTelefono1.addTextChangedListener(new TextWatcher() {

      @Override
      public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub
        
      }

      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub
        
      }

      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (start+count>0)
          nuevoTelefono1.setVisibility(View.VISIBLE);
        else
          nuevoTelefono1.setVisibility(View.GONE);
      }
   });
    
    clienteTelefono2.addTextChangedListener(new TextWatcher() {

      @Override
      public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub
        
      }

      @Override
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub
        
      }

      @Override
      public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (start+count>0)
          nuevoTelefono2.setVisibility(View.VISIBLE);
        else
          nuevoTelefono2.setVisibility(View.GONE);
      }
   });

    nuevoTelefono1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        nuevoTelefono1.setVisibility(View.GONE);
        findViewById(R.id.cliente_detail_telefono_info2).setVisibility(View.VISIBLE);
        clienteTelefonoTipo2.setAdapter(myAdap);
        clienteTelefonoTipo2.setSelection(0);

      }
    });
    
    nuevoTelefono2.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        nuevoTelefono2.setVisibility(View.GONE);
        findViewById(R.id.cliente_detail_telefono_info3).setVisibility(View.VISIBLE);
        clienteTelefonoTipo3.setAdapter(myAdap);
        clienteTelefonoTipo3.setSelection(0);
     }
    });
  }



  @Override
  protected void onStart() {
    super.onStart();
    TrackRecordingServiceConnectionUtils.startConnection(this, trackRecordingServiceConnection);
  }
  
  @Override
  protected void onStop() {
    super.onStop();
    trackRecordingServiceConnection.unbind();
  }

  @Override
  protected int getLayoutResId() {
    return R.layout.cliente_edit;
  }

  /**
   * Updates the UI based on the cliente id.
   */
  private void updateUiByclienteId() {
  
    setTitle(newCliente ? R.string.menu_insert_cliente : R.string.menu_edit);
    done.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if (!clienteNombre.getText().toString().equals("")){
          if (newCliente) {
            addcliente();
          } else {
            updateCliente();
          }
          Intent intent = IntentUtils.newIntent(ClienteEditActivity.this, ClientesListActivity.class);
          finish();
          startActivity(intent);
        }
        else{
          Toast.makeText(getApplicationContext(), R.string.cliente_add_error_empty_name, Toast.LENGTH_SHORT).show();
        }
      }
    });
  
    if (newCliente) {
      clienteNombre.selectAll();
      clienteTelefonoTipo1.setAdapter(myAdap);
    } 
    else {
      dbCliente = new ClienteDataSource(this);
      dbCliente.open();
      cliente =  dbCliente.getCliente(clienteId);
      if (cliente == null) {
        Log.d(TAG, "cliente is null");
        finish();
        return;
      }
      else{
        clienteNombre.setText(cliente.getNombre());
        rellenarTelefonos();
        clienteDireccion.setText(cliente.getDireccion());
        clienteEmail.setText(cliente.getEmail());
      }
    }
  }

  private void rellenarTelefonos() {
    
    clienteTelefonoTipo1.setAdapter(myAdap);
    dbTelefonoCliente = new TelefonoClienteDataSource(this);
    dbTelefonoCliente.open();
    telefonosCliente = dbTelefonoCliente.getAllTelefonoCliente(clienteId);
    if (telefonosCliente.size()>0){
      clienteTelefono1.setText(telefonosCliente.get(0).getNumero());
      int spinnerPosition = myAdap.getPosition(telefonosCliente.get(0).getTipo());
      clienteTelefonoTipo1.setSelection(spinnerPosition);
      if (telefonosCliente.size()>1){
        clienteTelefonoTipo2.setAdapter(myAdap);
        clienteTelefono2.setText(telefonosCliente.get(1).getNumero());
        spinnerPosition = myAdap.getPosition(telefonosCliente.get(1).getTipo());
        clienteTelefonoTipo2.setSelection(spinnerPosition);
        findViewById(R.id.cliente_detail_telefono_info2).setVisibility(View.VISIBLE);
        nuevoTelefono1.setVisibility(View.GONE);
        if (telefonosCliente.size()>2){
          clienteTelefonoTipo3.setAdapter(myAdap);
          clienteTelefono3.setText(telefonosCliente.get(2).getNumero());
          spinnerPosition = myAdap.getPosition(telefonosCliente.get(2).getTipo());
          clienteTelefonoTipo3.setSelection(spinnerPosition);
          findViewById(R.id.cliente_detail_telefono_info3).setVisibility(View.VISIBLE);
          nuevoTelefono2.setVisibility(View.GONE);
        }
      }
    }
  }
  
  /**
   * Adds a client.
   */
  private void addcliente() {
    
    dbCliente = new ClienteDataSource(this);
    dbCliente.open();
    dbTelefonoCliente = new TelefonoClienteDataSource(this);
    dbTelefonoCliente.open();
    Cliente clienteCreation = new Cliente(
        clienteNombre.getText().toString(),
        clienteDireccion.getText().toString(), clienteEmail.getText().toString());
    long insertClienteId = dbCliente.createCliente(clienteCreation);
    
    if (!(clienteTelefono1.getText().toString().equals(""))){
      TelefonoCliente telefonoClienteCreation = new TelefonoCliente(insertClienteId,
      clienteTelefono1.getText().toString(),
      clienteTelefonoTipo1.getSelectedItem().toString());
      dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation);
    }

    if (!(clienteTelefono2.getText().toString().equals(""))){
      TelefonoCliente telefonoClienteCreation2 = new TelefonoCliente(insertClienteId,
      clienteTelefono2.getText().toString(),
      clienteTelefonoTipo2.getSelectedItem().toString());
      dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation2);
      }
    
    if (!(clienteTelefono3.getText().toString().equals(""))){
      TelefonoCliente telefonoClienteCreation3 = new TelefonoCliente(insertClienteId,
      clienteTelefono3.getText().toString(),
      clienteTelefonoTipo3.getSelectedItem().toString());
      dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation3);
      }
    Toast.makeText(this, R.string.cliente_add_success, Toast.LENGTH_SHORT).show();
  }

  /**
   * update a cliente.
   */
  private void updateCliente() {
    Cliente clienteCreation = new Cliente(clienteId,
        clienteNombre.getText().toString(),
        clienteDireccion.getText().toString(), clienteEmail.getText().toString());
    dbCliente.updateCliente(clienteCreation);
    updateTelefonos();
  }
  
  private void updateTelefonos(){
    
    if (telefonosCliente.size()>0){
      if((telefonosCliente.get(0).getNumero()!=clienteTelefono1.getText().toString() || 
          telefonosCliente.get(0).getTipo()!=clienteTelefonoTipo1.getSelectedItem().toString())){
        TelefonoCliente telefonoClienteCreation = new TelefonoCliente(telefonosCliente.get(0).getId(),
            clienteId,clienteTelefono1.getText().toString(), clienteTelefonoTipo1.getSelectedItem().toString());
        dbTelefonoCliente.updateTelefonoCliente(telefonoClienteCreation);
      }
      if (telefonosCliente.size()>1){
        if((telefonosCliente.get(1).getNumero()!=clienteTelefono2.getText().toString() || 
            telefonosCliente.get(1).getTipo()!=clienteTelefonoTipo2.getSelectedItem().toString())){
          TelefonoCliente telefonoClienteCreation = new TelefonoCliente(telefonosCliente.get(1).getId(),
              clienteId,clienteTelefono2.getText().toString(), clienteTelefonoTipo2.getSelectedItem().toString());
          dbTelefonoCliente.updateTelefonoCliente(telefonoClienteCreation);
        }
        if (telefonosCliente.size()>2){
          if((telefonosCliente.get(2).getNumero()!=clienteTelefono3.getText().toString() || 
              telefonosCliente.get(2).getTipo()!=clienteTelefonoTipo3.getSelectedItem().toString())){
            TelefonoCliente telefonoClienteCreation = new TelefonoCliente(telefonosCliente.get(2).getId(),
                clienteId,clienteTelefono3.getText().toString(), clienteTelefonoTipo3.getSelectedItem().toString());
            dbTelefonoCliente.updateTelefonoCliente(telefonoClienteCreation);
          }
        }
        else{
          if (!(clienteTelefono3.getText().toString().equals(""))){
            TelefonoCliente telefonoClienteCreation2 = new TelefonoCliente(clienteId,
            clienteTelefono3.getText().toString(),
            clienteTelefonoTipo3.getSelectedItem().toString());
            dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation2);
            }
        }
      }
      else{
        if (!(clienteTelefono2.getText().toString().equals(""))){
          TelefonoCliente telefonoClienteCreation2 = new TelefonoCliente(clienteId,
          clienteTelefono2.getText().toString(),
          clienteTelefonoTipo2.getSelectedItem().toString());
          dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation2);
        }
      }
    }
    else{
      if (!(clienteTelefono1.getText().toString().equals(""))){
        TelefonoCliente telefonoClienteCreation = new TelefonoCliente(clienteId,
        clienteTelefono1.getText().toString(),
        clienteTelefonoTipo1.getSelectedItem().toString());
        dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation);
      }

      if (!(clienteTelefono2.getText().toString().equals(""))){
        TelefonoCliente telefonoClienteCreation2 = new TelefonoCliente(clienteId,
        clienteTelefono2.getText().toString(),
        clienteTelefonoTipo2.getSelectedItem().toString());
        dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation2);
      }
      
      if (!(clienteTelefono3.getText().toString().equals(""))){
        TelefonoCliente telefonoClienteCreation3 = new TelefonoCliente(clienteId,
        clienteTelefono3.getText().toString(),
        clienteTelefonoTipo3.getSelectedItem().toString());
        dbTelefonoCliente.createTelefonoCliente(telefonoClienteCreation3);
      }
    }
  }
}
